/**
 * 计算斐波那契数列的第n个数。
 * @param {number} n - 斐波那契数列的位置（从1开始计数）。
 * @returns {number} 返回斐波那契数列的第n个数值。
 */
function fibonacci(n) {
  // 当n为1或2时，直接返回1，这是斐波那契数列的前两个数。
  if (n === 1 || n === 2) {
    return 1;
  }
  let p1 = 1, // 初始化前两个数，p1为1。
    p2 = 1, // p2也为1。
    r; // 用于存储每次计算的和。
  // 循环计算斐波那契数列的第n个数。
  for (let i = 2; i < n; i++) {
    r = p1 + p2; // 计算当前数。
    p1 = p2; // 更新p1为前一个数。
    p2 = r; // 更新p2为当前数。
  }
  return r; // 返回计算结果。
}

console.log(fibonacci(10));

/**
 * 计算从左上角到右下角的唯一路径数量。
 * 参数 m 表示网格的行数，n 表示网格的列数。
 * 返回值为从起点到终点的唯一路径数量。
 * @param {number} m - 网格的行数
 * @param {number} n - 网格的列数
 * @returns {number} 唯一路径的数量
 */
var uniquePaths = function (m, n) {
  // 初始化动态规划数组，dp[i] 表示到达第 i 列的路径数量
  const dp = new Array(n).fill(1);

  // 逐行计算路径数量
  for (let i = 1; i < m; i++) {
    // 逐列更新路径数量，当前列的路径数量等于前一列的路径数量加上当前列的路径数量
    for (let j = 1; j < n; j++) {
      dp[j] += dp[j - 1];
    }
  }

  // 返回到达终点的路径数量
  return dp[n - 1];
};
